﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using AVEIT.autogestionAVEIT.Negocio.Entidades;
using System.Data.SqlClient;
using AVEIT.autogestionAVEIT.AccesoDatos;
using System.Data;

namespace AVEIT.autogestionAVEIT.Negocio.Gestores
{
    public class GestorSocio
    {
        public static int grabarSocio(Socio soc)
        {

            try
            {
                String cadena_domicilio = "INSERT INTO Domicilio (id_localidad, calle, numero, piso, departamento, barrio, codigoPostal) VALUES (@localidad, @calle, @numero, @piso, @depto, @barrio, @cod_postal );SELECT  @@identity;";

                SqlParameter pr_loc = new SqlParameter("@localidad", soc.domicilio.id_localidad);
                SqlParameter pr_calle = new SqlParameter("@calle", soc.domicilio.calle);
                SqlParameter pr_numero = new SqlParameter("@numero", soc.domicilio.numero);
                SqlParameter pr_piso = new SqlParameter("@piso", soc.domicilio.piso);
                SqlParameter pr_depto = new SqlParameter("@depto", soc.domicilio.departamento);
                SqlParameter pr_barrio = new SqlParameter("@barrio", soc.domicilio.barrio);
                SqlParameter pr_cod_postal = new SqlParameter("@cod_postal", soc.domicilio.cod_postal);

                int numero_domicilio_generado = AccesoADatos.ejecutarSQLeIdentity(cadena_domicilio, pr_loc, pr_calle, pr_numero, pr_piso, pr_depto, pr_barrio, pr_cod_postal);

                String cadena_socio = "INSERT INTO Socio(nombre, apellido, numeroDNI, id_tipoDNI, grupo, id_estado," +
                "fecha_nacimiento, id_domicilio, año_social, id_usuario, facebook) VALUES" +
                "(@nombre, @apellido, @numeroDNI, @id_tipoDNI, @grupo, @id_estado, @fecha_nacimiento, " +
                "@id_domicilio, @año_social, 1, @facebook); SELECT  @@identity;";


                SqlParameter pr_nombre = new SqlParameter("@nombre", soc.nombre);
                SqlParameter pr_apellido = new SqlParameter("@apellido", soc.apellido);
                SqlParameter pr_num_dni = new SqlParameter("@numeroDNI", soc.numero_dni);
                SqlParameter pr_tipo_dni = new SqlParameter("@id_tipoDNI", soc.tipo_dni);
                SqlParameter pr_grupo = new SqlParameter("@grupo", soc.grupo);
                SqlParameter pr_estado = new SqlParameter("@id_estado", soc.estado);
                SqlParameter pr_fec_nac = new SqlParameter("@fecha_nacimiento", soc.fecha_nacimiento);
                SqlParameter pr_domicilio = new SqlParameter("@id_domicilio", numero_domicilio_generado);
                SqlParameter pr_año_social = new SqlParameter("@año_social", soc.año_social);
                SqlParameter pr_id_usuario = new SqlParameter("@id_usuario", soc.id_usuario);
                SqlParameter pr_facebook = new SqlParameter("@facebook", soc.facebook);

                int numero_socio_generado = AccesoADatos.ejecutarSQLeIdentity(cadena_socio, pr_nombre, pr_apellido, pr_num_dni, pr_tipo_dni, pr_grupo, pr_estado, pr_fec_nac, pr_domicilio, pr_año_social, pr_facebook);

                String cadena_email = "INSERT INTO MailXSocio (numeroSocio, mail) VALUES (@num_soc, @mail)";

                SqlParameter pr_num_soc = new SqlParameter("@num_soc", numero_socio_generado);
                SqlParameter pr_mail = new SqlParameter("@mail", soc.mail);

                AccesoADatos.ejecutarSQL(cadena_email, pr_num_soc, pr_mail);

                string cadena_telefono = "INSERT INTO TelefonoXSocio (numeroSocio, id_TipoTelefono, caracteristica, telefono) VALUES " +
                    "(@num_soc, @tipo_tel, @carac, @telefono)";

                SqlParameter pr_num_socio = new SqlParameter("@num_soc", numero_socio_generado);
                SqlParameter pr_tipo_tel = new SqlParameter("@tipo_tel", soc.tipo_telefono);
                SqlParameter pr_caracteristica = new SqlParameter("@carac", soc.tel_caracteristica);
                SqlParameter pr_telefono = new SqlParameter("@telefono", soc.tel_numero);

                AccesoADatos.ejecutarSQL(cadena_telefono, pr_num_socio, pr_tipo_tel, pr_caracteristica, pr_telefono);

                return numero_socio_generado;
            }
            catch (Exception)
            {
                return -1;
            }
        }

        public static bool modificarSocio(Socio soc)
        {
            String cadena_socio = "UPDATE Socio SET nombre = @nombre, apellido = @apellido, numeroDNI = @numeroDNI, " +
                " id_tipoDNI = @id_tipoDNI, grupo = @grupo, fecha_nacimiento = @fecha_nacimiento, " +
                " año_social = @año_social, facebook = @facebook " +
                " WHERE numeroSocio = @num_soc";

            SqlParameter pr_nombre = new SqlParameter("@nombre", soc.nombre);
            SqlParameter pr_apellido = new SqlParameter("@apellido", soc.apellido);
            SqlParameter pr_num_dni = new SqlParameter("@numeroDNI", soc.numero_dni);
            SqlParameter pr_tipo_dni = new SqlParameter("@id_tipoDNI", soc.tipo_dni);
            SqlParameter pr_grupo = new SqlParameter("@grupo", soc.grupo);
            SqlParameter pr_estado = new SqlParameter("@id_estado", soc.estado);
            SqlParameter pr_fec_nac = new SqlParameter("@fecha_nacimiento", soc.fecha_nacimiento);
            SqlParameter pr_año_social = new SqlParameter("@año_social", soc.año_social);
            SqlParameter pr_id_usuario = new SqlParameter("@id_usuario", soc.id_usuario);
            SqlParameter pr_facebook = new SqlParameter("@facebook", soc.facebook);
            SqlParameter pr_num_soc = new SqlParameter("@num_soc", soc.numero_socio);

            AccesoADatos.ejecutarSQL(cadena_socio, pr_nombre, pr_apellido, pr_num_dni, pr_tipo_dni, pr_grupo, pr_fec_nac, pr_año_social, pr_facebook,pr_num_soc);


            String cadena_domicilio = "UPDATE Domicilio SET id_localidad = @id_localidad, calle = @calle, " +
                "numero = @numero, piso = @piso, departamento = @depto," +
                " barrio = @barrio , codigoPostal = @cod_postal" +
               " WHERE id_domicilio = @num_domicilio";
            
            SqlParameter pr_localidad = new SqlParameter("@id_localidad", soc.domicilio.id_localidad);
            SqlParameter pr_calle = new SqlParameter("@calle", soc.domicilio.calle);
            SqlParameter pr_numero = new SqlParameter("@numero", soc.domicilio.numero);
            SqlParameter pr_piso = new SqlParameter("@piso", soc.domicilio.piso);
            SqlParameter pr_depto = new SqlParameter("@depto", soc.domicilio.departamento);
            SqlParameter pr_barrio = new SqlParameter("@barrio", soc.domicilio.barrio);
            SqlParameter pr_num_domicilio = new SqlParameter("@num_domicilio", soc.domicilio.id_domicilio);
           
            SqlParameter pr_cod_postal = null;

            if (soc.domicilio.cod_postal == null)
            {
                pr_cod_postal = new SqlParameter("@cod_postal", DBNull.Value);
            }
            else
	        {
                pr_cod_postal = new SqlParameter("@cod_postal", soc.domicilio.cod_postal);
	        }
            
            AccesoADatos.ejecutarSQL(cadena_domicilio, pr_localidad, pr_calle, pr_numero, pr_piso, pr_depto, pr_barrio, pr_cod_postal,pr_num_domicilio);

            string cadena_mail = "UPDATE MailXSocio SET mail= @mail WHERE numeroSocio = @num_s";
            
            SqlParameter pr_email = new SqlParameter("@mail", soc.mail);
            SqlParameter pr_num_s = new SqlParameter("@num_s", soc.numero_socio); 
            
            AccesoADatos.ejecutarSQL(cadena_mail, pr_email,pr_num_s);

            string cadena_telefono = "UPDATE TelefonoXSocio SET id_TipoTelefono = @tipo_tel, caracteristica = @carac, telefono = @telefono WHERE numeroSocio = @num_soci";
            SqlParameter pr_tipo_tel = new SqlParameter("@tipo_tel", soc.tipo_telefono);
            SqlParameter pr_caracteristica = new SqlParameter("@carac", soc.tel_caracteristica);
            SqlParameter pr_telefono = new SqlParameter("@telefono", soc.tel_numero);
            SqlParameter pr_num_soci = new SqlParameter("@num_soci", soc.numero_socio); 
            AccesoADatos.ejecutarSQL(cadena_telefono, pr_tipo_tel, pr_caracteristica, pr_telefono,pr_num_soci);

            return true;
        }

        public static DataTable ObtenerSocios()
        {
            return AccesoADatos.consultarSQL("SELECT numeroSocio, nombre, apellido FROM Socio");
        }

        public static Socio ObtenerSocio(int num_socio)
        {
            Socio soc ;
            SqlParameter pr_num_socio = new SqlParameter("@num_socio", num_socio);
            string cadena = "SELECT Socio.apellido, Socio.nombre, Socio.numeroDNI, "+
                "Socio.id_tipoDNI, Socio.grupo, Socio.id_estado, Socio.fecha_nacimiento,"+
                "Socio.id_domicilio,  Socio.año_social, Socio.id_usuario, Socio.facebook, "+
                " MailXSocio.mail, TelefonoXSocio.caracteristica, TelefonoXSocio.telefono, TipoTelefono.id_tipoTelefono, " +
                " Domicilio.calle, Domicilio.numero, Domicilio.piso, Domicilio.departamento, Domicilio.barrio, Domicilio.codigoPostal, " +
                " Domicilio.id_localidad, Provincia.id_provincia, Pais.id_pais"+
                " FROM Socio, MailXSocio, TelefonoXSocio, TipoTelefono, Domicilio, Ciudad, Provincia, Pais"+
                " WHERE Socio.numeroSocio = MailXSocio.numeroSocio and Socio.numeroSocio = TelefonoXSocio.numeroSocio" +
                " and Ciudad.id_ciudad = Domicilio.id_localidad and Domicilio.id_domicilio = Socio.id_domicilio "+
                " and Ciudad.id_provincia = Provincia.id_provincia and Provincia.id_pais = Pais.id_pais"+
                " and TelefonoXSocio.id_TipoTelefono = TipoTelefono.id_TipoTelefono "+
                " and Socio.numeroSocio = @num_socio";
            DataTable dt = AccesoADatos.consultarSQL(cadena, pr_num_socio);

            // Construyo un socio con el constructor por defecto, y asinando luego todos los valores de los atributos.
    
            soc = new Socio();
            soc.numero_socio = num_socio;
            soc.nombre = dt.Rows[0]["nombre"].ToString();
            soc.apellido = dt.Rows[0]["apellido"].ToString();
            soc.numero_dni = long.Parse(dt.Rows[0]["numeroDNI"].ToString());
            soc.tipo_dni = int.Parse(dt.Rows[0]["id_tipoDNI"].ToString());
            soc.grupo = int.Parse(dt.Rows[0]["grupo"].ToString());
            soc.estado = int.Parse(dt.Rows[0]["id_estado"].ToString());
            soc.fecha_nacimiento = DateTime.Parse(dt.Rows[0]["fecha_nacimiento"].ToString());
            soc.año_social = int.Parse(dt.Rows[0]["año_social"].ToString());
            soc.id_usuario = int.Parse(dt.Rows[0]["id_usuario"].ToString());
            soc.facebook = dt.Rows[0]["facebook"].ToString();
            soc.mail = dt.Rows[0]["mail"].ToString();
            soc.num_domicilio = int.Parse(dt.Rows[0]["id_domicilio"].ToString());
            soc.domicilio = new Domicilio();
            soc.domicilio.id_domicilio = soc.num_domicilio;
            soc.domicilio.calle = dt.Rows[0]["calle"].ToString();
            soc.domicilio.numero = int.Parse(dt.Rows[0]["numero"].ToString());
            soc.domicilio.piso = int.Parse(dt.Rows[0]["piso"].ToString());
            soc.domicilio.departamento = dt.Rows[0]["departamento"].ToString();
            soc.domicilio.barrio = dt.Rows[0]["barrio"].ToString();
            soc.domicilio.id_localidad = int.Parse(dt.Rows[0]["id_localidad"].ToString());
            soc.domicilio.id_provincia = int.Parse(dt.Rows[0]["id_provincia"].ToString());
            soc.domicilio.id_pais = int.Parse(dt.Rows[0]["id_pais"].ToString());
            if (dt.Rows[0]["codigoPostal"] != null)
            { soc.domicilio.cod_postal = int.Parse(dt.Rows[0]["codigoPostal"].ToString()); }
            soc.tipo_telefono = int.Parse(dt.Rows[0]["id_tipoTelefono"].ToString());
            soc.tel_caracteristica = int.Parse(dt.Rows[0]["caracteristica"].ToString());
            soc.tel_numero = int.Parse(dt.Rows[0]["telefono"].ToString());
                
            return soc;
        }
        public static void EliminarSocio(int id_soc, int num_dom)
        {
            SqlParameter pr_num_socio = new SqlParameter("@num_socio", id_soc);
            SqlParameter pr_num_domicilio = new SqlParameter("@num_domicilio", num_dom);
            string cadena_eliminar = "DELETE FROM TelefonoXSocio WHERE numeroSocio = @num_socio; "+
                "DELETE FROM MailXSocio WHERE numeroSocio = @num_socio; " +
                "DELETE FROM Socio WHERE numeroSocio = @num_socio " +
                "DELETE FROM Domicilio WHERE id_domicilio = @num_domicilio";
            AccesoADatos.ejecutarSQL(cadena_eliminar, pr_num_socio,pr_num_domicilio);
            
        }


    }
}